//
//  main.m
//  03-集合
//
//  Created by 李昊林 on 16/7/6.
//  Copyright © 2016年 李昊林. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
//1.数组
    //1>数组：可变数组 NSMutableArray与 不可变数组 NSArray
    //数组主要是有序的存放元素的集合类型。并且可以通过下表取值。
    
    //数组中存放的元素只能是对象类型
    
    //不可变数组只能取值
    //可变数组 可以进行增删改的操作
    
    
    
    // 不可变数组
    // 2>初始化数组
    //<1>初始化方法initwithObjects 后面填入的参数一定是对象类型
    //      可变参数  C语言中的链表
    //   书序填入你需要的元素
    //   初始化结束，以nil为判别标准
    NSArray *array = [[NSArray alloc]initWithObjects:@"123",nil,@"234",@"345",@"456", nil];
    NSLog(@"array=%@",array);
    //<2>构造器方法
    NSArray *arr = [NSArray arrayWithObjects:@"123",@"234",@"345",@"456", nil];
    //<3>字面量 同 字符串 NSString @"" NSNumber @()
    //    NSArray @[]
    //三种初始化方式，推荐使用字面量
    //字面量可以识别，对象是否为空值；但一般的初始化方法不可以
    //如果为空，字面量会崩溃  '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'
    //但是，初始化方法会识别nil为结束，并不会产生。造成数据丢失
    
    
//    NSObject * objc = nil;
    NSArray * myArray = @[@"123",@"234",@"345",@"456"];
    NSLog(@"myarray=%@",myArray);
    // 3>取值相关
    // <1>count取到数组中元素个数
    NSLog(@"%ld",arr.count);
    // <2> 数组中取值，通过下标去取值
    NSString * numberString = [arr objectAtIndex:0];
    // <3> 语法糖 取值方式 快捷取值
    NSString * numberStr = arr[0];
    // <4> 根据值取对应的下标
    NSUInteger indexOfObject = [arr indexOfObject:@"123"];
    NSLog(@"%ld",indexOfObject);
    // <5>判断对象是否在数组中
    BOOL isHaveObject = [arr containsObject:@"123"];
    NSLog(@"%@",isHaveObject ? @"YES":@"NO");
    // <6> 取数组中的第0位元素 / 取数组中最后一个元素（如果数组为空，返回对象为空，并且不会崩溃）
    [arr firstObject];
    [arr lastObject];
    
    // 4>不可变数组 改变元素(会生成新的数组，不会在原数组基础上进行修改)
    // 1>数组添加一个新的Object
    arr = [arr arrayByAddingObject:@"234"];
    NSLog(@"arr = %@",arr);
    // 2> 数组添加另一个数组中的所有元素
    arr = [arr arrayByAddingObjectsFromArray:array];
    NSLog(@"arr = %@",arr);
    //
    //
    
    
    
    
    // 可变数组
    // NSMutableArray
    // 1>初始化 同不可变数组
    // 如果遇到可变数组，只能使用初始化或者便利构造器
    // 字面两创建方法，不推荐使用
    NSMutableArray * mutableArray = [@[] mutableCopy];
    // 2> 取值方式 与 不可变数组 一样
    // 3> 可变数组改变数组中元素 addObject
    [mutableArray addObject:@"123"];
    // <2>
    [mutableArray insertObject:@"含蓄" atIndex:0];
    // <3>移除
    [mutableArray removeObjectAtIndex:0];
//    [mutableArray removeLastObject];
//    [mutableArray removeAllObjects];
    // <4>替换(使用替换时，数据对应位置不能为空)
    [mutableArray replaceObjectAtIndex:0 withObject:@"韩旭"];
    NSLog(@"mutableArray:%@",mutableArray);
    
    // 可变 与 不可变的区别
    // 1，可变可以改，但是不可变不可以。
    // 2，不可变调用改变了的方法时 会生成新的对象；可变调用改变方法时，在对象本身上进行修改
    // 3，可变 继承于 不可变的
    
    //将字符串根据某个子串，截取成数组
    //根据哪个子串截取，哪个子串就会消失
    NSString * urlString = @"www.a123cb.com";
    NSArray *urlArray = [urlString componentsSeparatedByString:@"."];
    NSLog(@"%@",urlArray);
    //根据某个子串将数组拼接成字符串
    NSArray *nameArray = @[@"韩旭",@"隔壁",@"老黄"];
    NSString *nameString = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"%@",nameString);
    
    
    
    
//    - (void)addObject:(ObjectType)anObject;
//    - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
//    - (void)removeLastObject;
//    - (void)removeObjectAtIndex:(NSUInteger)index;
//    - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
